import vnode from "./vnode";

/**
 *
 * @param sel
 * @param data
 * @param c 有三种形态
 * ①h('div',{},"String")
 * ②h('div',{},[])
 * ③h('div',{},h())
 * @returns {{data: *, children: *, elm: *, sel: *, text: *}}
 */
export default function (sel, data, c) {
    if (arguments.length != 3) {
        throw new Error('参数必须为三个')
    }
    // 检查参数c的类型
    if (typeof c == 'string' || typeof c == 'number') {
        console.log("文本类型")
        return vnode(sel, data, undefined, c, undefined)
    } else if (Array.isArray(c)) {
        console.log("数组类型")
        let children = [];
        for (let i = 0; i < c.length; i++) {
            if (!(typeof c[i] == 'object' && c[i].hasOwnProperty('sel'))) {
                throw new Error("传入的数组参数中有不是h函数")
            }
            // 这里不需要执行c[i]，因为测试语句中已经执行了，只需要收集就行
            children.push(c[i]);
        }
        // 循环结束了，说明children收集完毕了，此时可以返回虚拟节点，它有children属性
        return vnode(sel, data, children, undefined,undefined)
    } else if (typeof c == 'object' && c.hasOwnProperty('sel')) {
        console.log("对象")
        // 此时c是对象，传入的children只有c一个
        let children = [c];
        return vnode(sel, data, children, undefined,undefined)
    } else {
        throw new Error('传入的第三个参数类型错误')
    }
}
